﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Web.UI.HtmlControls;
using Metodesa.Logic;
using METODESA.Server.Data.Exceptions;
using METODESA.Server.Data.METODESA.Entity;
using METODESA.Server.Data.METODESA.Nhibernate;
using Metodesa.Tools;

namespace Metodesa.Views.Home
{
    public partial class ListCompra : System.Web.UI.Page
    {
        private string proveedorId;
        private string empleadoId;
        protected void Page_Load(object sender, EventArgs e)
        {
            PanelAdd.Visible = false;  //panel visible
            PanelEdit.Visible = false;
            Calendario.Visible = false; //calendario visible
            Calendario2.Visible = false; //calendario visible
            label.Visible = false;

            if (Session["User"] != null)  //sesion de usuario
            {
                Empleado usuario = (Empleado)Session["User"];
            }
            else
            {
                Response.Redirect("../../Views/Home/Index.aspx", true); //se redirecciona
            }

            String action = Request.QueryString.Get("a");

            if (action != null)
            {
                if (action.Equals("add")) 
                {
                    PanelAdd.Visible = true;  //panel agregar visible
                }
                if (action.Equals("s"))
                {
                    PanelEdit.Visible = true;
                    if(ProveedorList2.SelectedValue!=null)
                    {
                        proveedorId = ProveedorList2.SelectedValue; //le asigna el Id del proveedor
                        empleadoId = EmpleadoList2.SelectedValue;
                        
                    }
                    prepareEdit();
                }
            }

            String cale = Request.QueryString.Get("b");
            if (cale != null)
            {
                if (cale.Equals("muestra")) 
                {
                    Calendario.Visible = true; // Calendario de agregar
                }
                else if (cale.Equals("muestra2"))
                {
                    Calendario2.Visible = true; // Calendario de editar
                }
            }
            //Hasta aqui

        }

        /// <summary>
        /// prepara el edit
        /// </summary>
        private void prepareEdit()  
        {
            try
            {
                int ids = int.Parse(Request.QueryString["id"]);
                EditId.Value = ids.ToString();
                OrdenCompra compra = CompraDao.getCompraById(ids);
                bool closed = compra.Estado == 1;
                if (!closed)    //si no esta cerrada
                {
                    PanelEdit.Visible = true;
                    teFecha.Text = compra.Fecha;  //se le asigna la fecha al campo de texto

                    IList<Empleado> listEmpleados;
                    IList<Proveedor> listProveedores;

                    if (Session["ListEmpleados"] == null || ((IList<Empleado>)Session["ListEmpleados"]).Count==0)
                    {
                        listEmpleados = EmpleadoDao.getAllEmpleado();
                        Session.Add("ListEmpleados", listEmpleados);
                    }
                    else
                    {
                        listEmpleados = (IList<Empleado>)Session["ListEmpleados"];  //se le agrega la lista de empleados a la sesion
                    }

                    if (Session["ListProveedores"] == null)    //si listproveedores es nulo
                    {
                        listProveedores = ProveedorDao.getAllProveedor();
                        Session.Add("ListProveedores", listProveedores);
                    }
                    else
                    {
                        listProveedores = (IList<Proveedor>)Session["ListProveedores"];  //se le agrega la lista de proveedores a la sesion
                    }

                    ProveedorList2 = ComprasTools.ListProveedores(listProveedores, ProveedorList2);
                    if(!compra.detalleCompra.IsEmpty)
                        ProveedorList2.Enabled = false;
                    ProveedorList2.SelectedValue = compra.Proveedor.Id.ToString();
                    EmpleadoList2 = ComprasTools.ListEmpleados(listEmpleados, EmpleadoList2);
                    EmpleadoList2.SelectedValue = compra.Empleado.Id.ToString();

                }
            }
            catch
            {
                //TODO manejar error de formato
            }
        }

        /// <summary>
        /// Buscar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void FindButton_Click(object sender, EventArgs e)  
        {
            IList<OrdenCompra> lista;
            if(option!=null && option.SelectedItem!=null)
                lista=CompraLogic.processSearch(searchbox.Text, type.SelectedValue,option.SelectedValue);
            else
                lista = CompraLogic.processSearch(searchbox.Text, type.SelectedValue, "");

            HtmlTable table = ComprasTools.ListCompra(lista);  //se asigna la tabla a table
         

            if (table != null)                   //si la tabla esta vacia
            {
                ListCompras.Controls.Add(table);
                ListCompras.Visible = true;           //muestra la lista
            }
            else
            {
                label.Visible = true;
                label.ForeColor = Color.DarkRed;
                label.Text = "No se encontraron compras que cumplan con la búsqueda";
            }

        }

        /// <summary>
        /// Prepara el agregado
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void PrepareAddButton_Click(object sender, EventArgs e)
        {
            PanelAdd.Visible = true;
            IList<Empleado> listEmpleados;
            IList<Proveedor> listProveedores;
            
            if (Session["ListEmpleados"] == null)    //si listempleados es null
            {
                listEmpleados = EmpleadoDao.getAllEmpleado();
                Session.Add("ListEmpleados",listEmpleados);
            }
            else
            {
                listEmpleados = (IList<Empleado>)Session["ListEmpleados"];
            }
            if (Session["ListProveedores"] == null)
            {
                listProveedores = ProveedorDao.getAllProveedor();
                     Session.Add("ListProveedores", listProveedores);
            }
            else
            {
                listProveedores = (IList<Proveedor>)Session["ListProveedores"];
            }
            ProveedorList = ComprasTools.ListProveedores(listProveedores, ProveedorList);
            EmpleadoList = ComprasTools.ListEmpleados(listEmpleados, EmpleadoList);
        }

        /// <summary>
        /// Invoco addcompra y muestro el panel
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void AddButton_Click(object sender, EventArgs e)
        {
            addCompra();
            taFecha.Text = ""; 
            PanelAdd.Visible = false;
        }

        private void addCompra()
        {
            try
            {
                CompraLogic.add(taFecha.Text,EmpleadoList.SelectedValue,ProveedorList.SelectedValue);
                label.Visible = true;
                label.ForeColor = Color.Blue;
                label.Text = "Compra agregada satifactoriamente";
            }
            #region manejo de errores
            catch (EntityCouldntBeSaved exception)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo agregar la compra";
                PanelAdd.Visible = true;
                Session.Add("Error", exception);
            }
            
            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
            #endregion
        }

        /// <summary>
        /// muestro el calendario 1
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Calendar1_SelectionChanged(object sender, EventArgs e)
        {
            taFecha.Text = Calendar1.SelectedDate.ToShortDateString();
            Calendario.Visible = false;
        }


        /// <summary>
        /// muestro el calendario
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ShowCalendar(object sender, EventArgs e)
        {
            Calendario.Visible = true;
        }

        /// <summary>
        /// muestro el calendario 2
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void cal2_Click(object sender, EventArgs e)
        {
            Calendario2.Visible = true;
        }

        /// <summary>
        /// Selecciona y asigna el valor de la fecha elegida
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Calendar2_SelectionChanged(object sender, EventArgs e)
        {
            teFecha.Text = Calendar2.SelectedDate.ToShortDateString();
            Calendario2.Visible = false;

        }


        /// <summary>
        /// llamo a edit compra
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void EditButton_Click(object sender, EventArgs e)
        {
            EditCompra();
            
            
        }

        /// <summary>
        /// Editar
        /// </summary>
        private void EditCompra()
        {
            try
            {
                CompraLogic.edit( int.Parse(EditId.Value),teFecha.Text,empleadoId,proveedorId);
                label.Visible = true;
                label.ForeColor = Color.Blue;
                label.Text = "Compra modificada satifactoriamente";
                PanelEdit.Visible = false;
                Calendario2.Visible = false;
                
            }
            #region manejo de errores
            catch (EntityCouldntBeUpdated exception)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo modificar la compra";
                PanelAdd.Visible = true;
                Session.Add("Error", exception);
            }
           
            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
            #endregion
        }
    }
}
